interface JWTTokenBaseData {
  aud: string[]
  exp: number
  iat: number
  iss: string
}

// isJWTTokenBaseData 守卫函数
function isJWTTokenBaseData(obj: any): obj is JWTTokenBaseData {
  return (
    typeof obj === 'object' &&
    Array.isArray(obj.aud) &&
    obj.aud.every((item: any) => typeof item === 'string') &&
    typeof obj.exp === 'number' &&
    typeof obj.iat === 'number' &&
    typeof obj.iss === 'string'
  )
}

// CheckToken 检查令牌是否过期
export function CheckToken(token: string): boolean {
  if (token === '') {
    return false
  }
  const res = token.split('.')
  if (res.length != 3) {
    throw new Error('jwt token str error')
  }
  const str = res[1]
  // 解析 jwt token 的负载部分
  const tokenData = JSON.parse(decodeURIComponent(MyEscape(window.atob(str))))
  // 转换类型
  if (isJWTTokenBaseData(tokenData)) {
    const currentTime = Math.floor(Date.now() / 1000) // 获取当前时间的秒数
    return currentTime < tokenData.exp // 判断是否过期, 当前时间 < 令牌时间
  }
  return false
}

// MyEscape 标准库 escape 替代
function MyEscape(v: string): string {
  return Array.prototype.map
    .call(v, function (c) {
      return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
    })
    .join('')
}
